import axios from 'axios'
import store from '@/store/index'
import JSONBig from 'json-bigint' // 引入大数字包
import router from '@/router'
const instance = axios.create({
  // 配置基地址
  baseURL: 'http://ttapi.research.itcast.cn',
  // 处理大数
  transformResponse: [function (data) {
    try {
      return JSONBig.parse(data)
    } catch (err) {
      return data
    }
  }]
})
console.log(store)
instance.interceptors.request.use(
  config => {
    // 取出token
    const token = store.state.tokenInfo.token
    if (token) { // 判断token是否存在
      config.headers.Authorization = `Bearer ${token}`// 将token设置成请求头
    }
    console.log(token)
    return config
  },
  err => {
    return Promise.reject(err)
  }
)
instance.interceptors.response.use(function (response) {
  // 对请求返回做一些事情
  return response
}, async function (error) {
  if (error.response && error.response.status === 401) {
    // token失效
    const refreshToken = store.state.tokenInfo.refresh_token
    if (refreshToken) {
    // 如果当前有refresh_token
      try {
        // 1.使用refreshtoken请求有效新token
        const result = await axios({
          method: 'PUT',
          url: 'http://ttapi.research.itcast.cn/app/v1_0/authorizations',
          headers: {
            Authorization: `Bearer ${refreshToken}`
          }
        })
        // 2.将新token更新操作 vuex  and  ls
        store.commit('saveToken', {
          refresh_token: refreshToken,
          token: result.data.data.tokenInfo
        })
        // error.config中保存了之前请求A所有的相关信息 包括请求地址 参数 方法
        // 只有请求头中的token是一个全新的有效的token
        // promise链式调用的问题 如果不使用async、await结果无法return出去
        // 下一个promise对象接收不到请求结果
        // 3. 使用新token和保存下来的接口其它信息重新发起请求
        return instance(error.config)
      } catch (error) {
        // 获取新token失败了
        router.push({
          path: '/login',
          query: {
            sourceFrom: router.currentRoute.fullPath
          }
        })
      }
    } else {
    // refresh不存在
    // 清理vuex
      store.commit('clearToken')
      // 跳回到登录页
      // 获取新token失败了
      router.push({
        path: '/login',
        query: {
          sourceFrom: router.currentRoute.fullPath
        }
      })
    }
  }

  return Promise.reject(error)
})
export default instance
